package com.example.myapplication.a_class.a04_expand

import com.example.myapplication.a_class.a01_open.Son
import com.example.myapplication.a_class.a04_expand.bean.FatherBean
import com.example.myapplication.a_class.a04_expand.bean.SonBean


object Start {

    @JvmStatic
    fun main(a: Array<String>) {

        //调用扩展函数
        val fatherBean: FatherBean = FatherBean()
        println(fatherBean.getCodeAndMsg())

        val sonBean: SonBean = SonBean()
        sonBean.getClazzName(FatherBean())
        sonBean.getClazzName(SonBean())

        val sonBean1: SonBean? = null
        println(sonBean1.toString())



        Connection(Host("kotl.in"), 443).connect()

    }


    /**
     * 在一个类内部你可以为另一个类声明扩展。在这样的扩展内部，
     * 有多个 隐式接收者 —— 其中的对象成员可以无需通过限定符访问。
     * 扩展声明所在的类的实例称为 分发接收者，扩展方法调用所在的接收者类型的实例称为 扩展接收者
     */
    class Host(val hostname: String) {

        fun printHostname() {
            print(hostname)
        }
    }

    class Connection(val host: Host,var port: Int) {

        fun printPort() {
            print(port)
        }

        fun Host.printConnectionString() {

            printHostname()   // 调用 Host.printHostname()
            print(":奥术")
            printPort()   // 调用 Connection.printPort()
        }

        fun connect() {
            /*……*/
            host.printConnectionString()   // 调用扩展函数
        }
    }


}